// 版权所有2017 etcd作者
// 
// 根据Apache许可证2.0版（以下简称“许可证”）获得许可；
// 除非遵守许可证，否则不得使用此文件。
// 您可以通过
// 
// www.apache.org/licenses/LICENSE-2.0 
// 
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，
// 无任何明示或暗示的保证或条件。
// 请参阅许可证，了解管理许可的特定语言和
// 许可证下的限制。

package clientv3

import (
	"math"
	"time"

	"google.golang.org/grpc"
)

var (
	// 当数据未写入线路或
	// 当服务器指示其未处理数据时，客户端处理重试请求失败。gRPC默认值为默认值为“WaitForReady（false）”
	// 但对于etcd，我们默认为“WaitForReady（true）”，以最小化由于
	// 瞬时故障导致的客户端请求错误响应。
	defaultWaitForReady = grpc.WaitForReady(true)

	// 客户端请求发送限制，gRPC默认为math。MaxInt32 
	// 确保“客户端发送限制<服务器端默认发送/接收限制”
	// 与“embed.DefaultMaxRequestBytes”加上gRPC开销字节
	defaultMaxCallSendMsgSize = grpc.MaxCallSendMsgSize(2 * 1024 * 1024)

	// 客户端响应接收限制，gRPC默认值为4MB 
	// 确保“客户端接收限制>=服务器端默认发送/接收限制“
	// 因为范围响应很容易超过请求发送限制
	// 默认为math。MaxInt32；超出服务器端发送限制的写入无论如何都会失败
	defaultMaxCallRecvMsgSize = grpc.MaxCallRecvMsgSize(math.MaxInt32)

	// 客户端非流式重试限制，仅适用于服务器以
	// 响应的请求，错误代码明确表示无法处理请求，如代码。不可用的
	// 如果设置为0，则禁用重试。
	defaultUnaryMaxRetries uint = 100

	// 客户端流式传输重试限制，仅适用于服务器以
	// 明确表示无法处理请求的错误代码（如代码）响应的请求。不可用的
	// 如果设置为0，则禁用重试。
	defaultStreamMaxRetries = ^uint(0) // 最大单位

	// 请求之间的客户端重试回退等待。
	defaultBackoffWaitBetween = 25 * time.Millisecond

	// 客户端重试回退默认抖动分数。
	defaultBackoffJitterFraction = 0.10
)

// defaultCallOpts定义了一个默认“gRPC.CallOption”列表。
// 有些选项暴露在“clientv3.Config”中。
// 默认值将被“clientv3.Config”中的设置覆盖。
var defaultCallOpts = []grpc.CallOption{
	defaultWaitForReady,
	defaultMaxCallSendMsgSize,
	defaultMaxCallRecvMsgSize,
}

// MaxLeaseTTL是最大租赁TTL值
const MaxLeaseTTL = 9000000000
